
[dbo].[asi_HierarchyMoveBranch]
CREATE PROCEDURE [dbo].[asi_HierarchyMoveBranch] @moveHierarchyKey uniqueidentifier, @targetHierarchyKey uniqueidentifier, @addType smallint = 1 AS
DECLARE
@MoveRootHierarchyKey uniqueidentifier, @MoveDepth int, @MoveLowSort int, @MoveHighSort int,
@TargetDepth int, @TargetLowSort int, @TargetHighSort int, @TargetRootHierarchyKey uniqueidentifier,
@TargetParentHierarchyKey uniqueidentifier, @Adjustment int, @MoveAdjustment int, @DepthAdjustment int
BEGIN
SELECT @MoveRootHierarchyKey = a.RootHierarchyKey, @MoveDepth = a.Depth, @MoveLowSort = a.SortOrder, @MoveHighSort = Min(b.SortOrder) - 1
FROM Hierarchy a LEFT OUTER JOIN Hierarchy b
ON a.RootHierarchyKey = b.RootHierarchyKey
AND a.SortOrder < b.SortOrder
AND a.Depth >= b.Depth
WHERE a.HierarchyKey = @moveHierarchyKey
GROUP BY a.RootHierarchyKey, a.Depth, a.SortOrder
IF @MoveHighSort IS NULL
SELECT @MoveHighSort = Max(a.SortOrder)
FROM Hierarchy a
WHERE a.RootHierarchyKey = @MoveRootHierarchyKey
EXEC asi_HierarchyGetAdjacentSortOut @targetHierarchyKey, @addType, @TargetLowSort OUTPUT
SELECT @TargetRootHierarchyKey = a.RootHierarchyKey, @TargetDepth = a.Depth,
@TargetParentHierarchyKey = a.ParentHierarchyKey, @TargetHighSort = Min(b.SortOrder)
FROM Hierarchy a LEFT OUTER JOIN Hierarchy b
ON a.RootHierarchyKey = b.RootHierarchyKey
AND b.SortOrder > @TargetLowSort
WHERE a.HierarchyKey = @targetHierarchyKey
GROUP BY a.RootHierarchyKey, a.Depth, a.ParentHierarchyKey
If @addType = 2 OR @addType = 3
BEGIN
SET @TargetParentHierarchyKey = @targetHierarchyKey
SET @TargetDepth = @TargetDepth + 1
END
SET @Adjustment = 0
IF @TargetHighSort IS NOT NULL AND (@MoveLowSort <> @TargetLowSort OR @MoveRootHierarchyKey <> @TargetRootHierarchyKey)
BEGIN
SET @Adjustment = @MoveHighSort - @MoveLowSort + 2048
UPDATE Hierarchy
SET SortOrder = SortOrder + @Adjustment
WHERE SortOrder >= @TargetHighSort
AND RootHierarchyKey = @TargetRootHierarchyKey
END
IF @MoveLowSort <= @TargetLowSort
SET @Adjustment = 0
SET @MoveAdjustment = (@TargetLowSort + 2048) - (@MoveLowSort + @Adjustment)
IF @MoveLowSort = @TargetLowSort
SET @MoveAdjustment = 0
SET @DepthAdjustment = @TargetDepth - @MoveDepth
UPDATE Hierarchy
SET SortOrder = SortOrder + @MoveAdjustment,
RootHierarchyKey = @TargetRootHierarchyKey,
Depth = Depth + @DepthAdjustment
WHERE RootHierarchyKey = @MoveRootHierarchyKey
AND SortOrder >= @MoveLowSort + @Adjustment
AND SortOrder <= @MoveHighSort + @Adjustment
UPDATE Hierarchy
SET ParentHierarchyKey = @TargetParentHierarchyKey
WHERE HierarchyKey = @moveHierarchyKey
END
GO